# Copyright 2021 The SuningBank
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#auth 16080951
import re
import xml.etree.ElementTree as ET
from utils import *

class BillProcess:
    def __init__(self):
        self.data = {}
        self.util = Util()

    # 解析读取到的文件数据
    def processSinglePage(self, fileNameNoKZ,pages):
        util = self.util
        self.data = {}
        title = []
        element = []
        dealCode = ['成交单号']
        nhinfo = ['逆回购方信息机构', '逆回购方信息交易员', '逆回购方信息交易员ID', '逆回购方信息电话', '逆回购方信息传真', '逆回购方信息法定代表人', '逆回购方信息机构地址']
        zhinfo = ['正回购方信息机构', '正回购方信息交易员', '正回购方信息交易员ID', '正回购方信息电话', '正回购方信息传真', '正回购方信息法定代表人', '正回购方信息机构地址']
        cjinfo = ['票面总额(元)', '票据类别', '应付利息(元)', '票据介质', '首期结算金额(元)', '首期结算日', '到期结算金额(元)',
                  '到期结算日', '回购金额(元)', '结算方式', '回购利率', '清算类型', '回购收益率', '票据张数', '回购期限', '最晚首期结算时间']
        cjinfonh = ['逆回购方账户信息支付系统行名', '逆回购方账户信息支付系统行号', '逆回购方账户信息资金账户名称', '逆回购方账户信息资金账号', '逆回购方账户信息托管账户名称',
                    '逆回购方账户信息托管账号']
        cjinfozh = ['正回购方账户信息支付系统行名', '正回购方账户信息支付系统行号', '正回购方账户信息资金账户名称', '正回购方账户信息资金账号', '正回购方账户信息托管账户名称',
                    '正回购方账户信息托管账号']

        title.extend(dealCode)
        title.extend(nhinfo)
        title.extend(zhinfo)
        title.extend(cjinfo)
        title.extend(cjinfonh)
        title.extend(cjinfozh)
        self.data['title'] = title
        self.data['element'] = element
        self.data['element'].clear()


        # 每页取出，将页面中的数据进行解析。
        for xml in pages:

            tree = ET.parse(xml)
            # 每页中的关键数据进行提取
            glyphs = tree.findall(".//{http://schemas.microsoft.com/xps/2005/06}Glyphs")
            # 结构化数据变量
            glyphsUnicodeArry = []
            appendData = []
            for glyphsData in glyphs:
                glyphsUnicodeArry.append(glyphsData.attrib['UnicodeString'])
            # example
            # 票据质押式回购成交单|成交时间：|2021-04-20 15:06:39|上海票据交易所|
            # 成交单编号：|CR20210420000081|正回购方信息|机构|江苏苏宁银行股份有限公司|交易员|魏青|
            # 交易员|ID|17071878|电话|025-66996699|传真|025-66996699|法定代表人或负责人|黄金老|
            # 机构地址|南京市建邺区45号地块金融城4号楼707室|逆回购方信息|机构|蒙商银行股份有限公司|
            # 交易员|高娜|交易员|ID|700328|电话|传真|0472-3160161|法定代表人或负责人|杨险峰|
            # 机构地址|内蒙古自治区包头市九原区赛汗街道办事处|建华南路2号|A|座|成交信息|
            # 票面总额(元)|103,814,627.98|应付利息(元)|5,623.29|首期结算金额(元)|103,809,004.69|
            # 到期结算金额(元)|103,814,627.98|回购金额(元)|103,814,627.98|回购利率|1.9500|%|回购收益率|1.9501|%|回购期限|1|天|
            # 票据张数|179|正回购方账户信息|支付系统行名|江苏苏宁银行股份有限公司|支付系统行号|323301000019|资金账户名称|
            # 待支付清算款项|-|即时转账借记来|账|资金账号|188018016304400001|托管账户名称|江苏苏宁银行托管账户|
            # 托管账号|C121027143200009145800|票据类别|银票|票据介质|电票|首期结算日|2021-04-20|
            # 到期结算日|2021-04-21|结算方式|票款对付（|DVP）|清算类型|全额|最晚首期结算时间|17:15:00|逆回购方账户信息|
            # 支付系统行名|蒙商银行股份有限公司|支付系统行号|313192000013|资金账户名称|0|资金账号|0|托管账户名称|蒙商银行托管账户|
            # 托管账号|C121010251500002965400|*交易合同一方违约，违约方应根据双方约定向对方承担违约责任。
            excelData = "|".join(glyphsUnicodeArry)
            excelData = excelData.replace('|电话|传真|', '|电话|无|传真|')
            excelData = excelData.replace('|传真|法定代表人', '|传真|无|法定代表人')

            # ========================票据质押式回购成交单信息===============================================
            # 成交单号
            dealCode =util.toStr(re.findall(r'成交单编号：\|(.*?)\|正回购方信息', excelData))
            # 正/逆回购方信息
            grgName = re.findall(r'机构\|(.*?)\|交易员', excelData)
            # 交易员
            trader = re.findall(r'交易员\|(.*?)\|交易员\|ID', excelData)
            # 交易员ID
            traderId = re.findall(r'交易员\|ID\|(.*?)\|电话', excelData)

            # 正回电话
            sqPhone = util.toStr(re.findall(r'正回购方信息\|.*?电话\|(.*?)\|传真', excelData))
            # 逆回电话
            isqPhone = util.toStr(re.findall(r'逆回购方信息\|.*?电话\|(.*?)\|传真', excelData))
            # 正回传真
            sqFax = util.toStr(re.findall(r'正回购方信息\|.*?传真\|(.*?)\|法定代表人或负责人', excelData))
            # 逆回传真
            isqFax = util.toStr(re.findall(r'逆回购方信息\|.*?传真\|(.*?)\|法定代表人或负责人', excelData))
            # 正/逆法定人
            legalPerson = re.findall(r'法定代表人或负责人\|(.*?)\|机构地址', excelData)

            # 正向地址
            sqAddress = util.toStr(re.findall(r'正回购方信息\|.*?机构地址\|(.*?)\|逆回购方信息', excelData))
            # 逆向地址
            isqAddress = util.toStr(re.findall(r'逆回购方信息\|.*?机构地址\|(.*?)\|成交信息', excelData))

            # nhinfo = ['逆回购方信息机构', '逆回购方信息交易员', '逆回购方信息交易员ID', '逆回购方信息电话', '逆回购方信息传真', '逆回购方信息法定代表人', '逆回购方信息机构地址']

            appendData.append(dealCode)
            appendData.append(grgName[1])
            appendData.append(trader[1])
            appendData.append(traderId[1])
            appendData.append(isqPhone)
            appendData.append(isqFax)
            appendData.append(legalPerson[1])
            appendData.append(isqAddress)

            # zhinfo = ['正回购方信息机构', '正回购方信息交易员', '正回购方信息交易员ID', '正回购方信息电话', '正回购方信息传真', '正回购方信息法定代表人', '正回购方信息机构地址']

            appendData.append(grgName[0])
            appendData.append(trader[0])
            appendData.append(traderId[0])
            appendData.append(sqPhone)
            appendData.append(sqFax)
            appendData.append(legalPerson[0])
            appendData.append(sqAddress)

            # ========================成交信息===============================================
            # 票面总额
            fvTotal = util.toStr(re.findall(r'票面总额\(元\)\|(.*?)\|应付利息\(元\)', excelData))
            # 应付利息
            interestPayable = util.toStr(re.findall(r'应付利息\(元\)\|(.*?)\|首期结算金额\(元\)', excelData))
            # 首期结算金额
            initialSettlementAmount = util.toStr(re.findall(r'首期结算金额\(元\)\|(.*?)\|到期结算金额\(元\)', excelData))
            # 到期结算金额
            duSettlementAmount = util.toStr(re.findall(r'到期结算金额\(元\)\|(.*?)\|回购金额\(元\)', excelData))
            # 回购金额
            repurchaseSettlementAmount = util.toStr(re.findall(r'回购金额\(元\)\|(.*?)\|回购利率', excelData))
            # 回购利率
            repoRate = util.toStr(re.findall(r'回购利率\|(.*?)\|回购收益率', excelData))
            # 回购收益率
            repoYield = util.toStr(re.findall(r'回购收益率\|(.*?)\|回购期限', excelData))
            # 回购期限
            repoTerm = util.toStr(re.findall(r'回购期限\|(.*?)\|票据张数', excelData))
            # 票据张数
            tickNum = util.toStr(re.findall(r'票据张数\|(.*?)\|正回购方账户信息', excelData))

            # 票据类别|银票|票据介质|电票|首期结算日|2021-04-20|
            # 到期结算日|2021-04-21|结算方式|票款对付（|DVP）|清算类型|全额|最晚首期结算时间|17:15:00|
            # 票据类别
            billCategory = util.toStr(re.findall(r'票据类别\|(.*?)\|票据介质', excelData))
            # 票据介质
            billMedium = util.toStr(re.findall(r'票据介质\|(.*?)\|首期结算日', excelData))
            # 首期结算日
            firstSettlementDate = util.toStr(re.findall(r'首期结算日\|(.*?)\|到期结算日', excelData))
            # 到期结算日
            dueSettlementDate = util.toStr(re.findall(r'到期结算日\|(.*?)\|结算方式', excelData))
            # 结算方式
            settlementType = util.toStr(re.findall(r'结算方式\|(.*?)\|清算类型', excelData))
            # 清算类型
            liquidationType = util.toStr(re.findall(r'清算类型\|(.*?)\|最晚首期结算时间', excelData))
            # 最晚首期结算时间
            lastSettlementDate = util.toStr(re.findall(r'最晚首期结算时间\|(.*?)\|', excelData))

            # cjinfo = ['票面总额(元)', '票据类别', '应付利息(元)', '票据介质', '首期结算金额(元)', '首期结算日', '到期结算金额(元)',
            #          '到期结算日', '回购金额(元)', '结算方式', '回购利率', '清算类型', '回购收益率', '票据张数', '回购期限', '最晚首期结算时间']

            appendData.append(fvTotal)
            appendData.append(billCategory)
            appendData.append(interestPayable)
            appendData.append(billMedium)
            appendData.append(initialSettlementAmount)
            appendData.append(firstSettlementDate)
            appendData.append(duSettlementAmount)
            appendData.append(dueSettlementDate)
            appendData.append(repurchaseSettlementAmount)
            appendData.append(settlementType)
            appendData.append(repoRate)
            appendData.append(liquidationType)
            appendData.append(repoYield)
            appendData.append(tickNum)
            appendData.append(repoTerm)
            appendData.append(lastSettlementDate)

            # ========================正逆信息===============================================
            # 正回购方账户信息 支付系统行名
            sqAccountBankName =util.toStr(re.findall(r'正回购方账户信息\|.*?支付系统行名\|(.*?)\|支付系统行号', excelData))
            # 正回购方账户信息 支付系统行号
            sqAccountBankNo =util.toStr(re.findall(r'正回购方账户信息\|.*?支付系统行号\|(.*?)\|资金账户名称', excelData))
            # 正回购方账户信息 资金账户名称
            sqAccountName =util.toStr(re.findall(r'正回购方账户信息\|.*?资金账户名称\|(.*?)\|资金账号', excelData))
            # 正回购方账户信息 资金账号
            sqAccountNo =util.toStr(re.findall(r'正回购方账户信息\|.*?资金账号\|(.*?)\|托管账户名称', excelData))
            # 正回购方账户信息 托管账户名称
            sqTGAccountName =util.toStr(re.findall(r'正回购方账户信息\|.*?托管账户名称\|(.*?)\|托管账号', excelData))
            # 正回购方账户信息 托管账号
            sqTGNo =util.toStr(re.findall(r'正回购方账户信息\|.*?托管账号\|(.*?)\|票据类别', excelData))

            # 逆回购方账户信息 支付系统行名
            isqAccountBankName =util.toStr(re.findall(r'逆回购方账户信息\|.*?支付系统行名\|(.*?)\|支付系统行号', excelData))
            # 逆回购方账户信息 支付系统行号
            isqAccountBankNo =util.toStr(re.findall(r'逆回购方账户信息\|.*?支付系统行号\|(.*?)\|资金账户名称', excelData))
            # 逆回购方账户信息 资金账户名称
            isqAccountName =util.toStr(re.findall(r'逆回购方账户信息\|.*?资金账户名称\|(.*?)\|资金账号', excelData))
            # 逆回购方账户信息 资金账号
            isqAccountNo =util.toStr(re.findall(r'逆回购方账户信息\|.*?资金账号\|(.*?)\|托管账户名称', excelData))
            # 逆回购方账户信息 托管账户名称
            isqTGAccountName =util.toStr(re.findall(r'逆回购方账户信息\|.*?托管账户名称\|(.*?)\|托管账号', excelData))
            # 逆回购方账户信息 托管账号
            isqTGNo =util.toStr(re.findall(r'逆回购方账户信息\|.*?托管账号\|(.*?)\|\*', excelData))

            # cjinfonh = ['逆回购方账户信息支付系统行名', '逆回购方账户信息支付系统行号', '逆回购方账户信息资金账户名称', '逆回购方账户信息资金账号', '逆回购方账户信息托管账户名称',
            #            '逆回购方账户信息托管账号']

            appendData.append(isqAccountBankName)
            appendData.append(isqAccountBankNo)
            appendData.append(isqAccountName)
            appendData.append(isqAccountNo)
            appendData.append(isqTGAccountName)
            appendData.append(isqTGNo)

            # cjinfozh = ['正回购方账户信息支付系统行名', '正回购方账户信息支付系统行号', '正回购方账户信息资金账户名称', '正回购方账户信息资金账号', '正回购方账户信息托管账户名称',
            #            '正回购方账户信息托管账号']
            appendData.append(sqAccountBankName)
            appendData.append(sqAccountBankNo)
            appendData.append(sqAccountName)
            appendData.append(sqAccountNo)
            appendData.append(sqTGAccountName)
            appendData.append(sqTGNo)
            self.data['element'].append(appendData)

        # 处理数据done
        util.doExcel(self.data['element'],self.data['title'],fileNameNoKZ)


    def destory(self):
        self.data.clear()


